import asyncio
import aiohttp
import Thread_example.spider


# 单线程异步IO
# 协程：单线程内实现并发
# requests库不支持异步，用aiohttp代替     原理：IO时不能阻塞，否则不能并发
# 异步爬虫，并发爬虫     相对与多线程来说，没有切换线程的开销，速度更快
async def async_craw(url):  # 定义协程第一步   协程函数
    print("craw url:", url)
    async with aiohttp.ClientSession() as session:  # 创建一个异步对象
        async with session.get(url) as resp:
            result = await resp.text()  # 定义协程第二步   # 获取结果
            print(f"craw url: {url}, {len(result)}")  # 截获长度


loop = asyncio.get_event_loop()  # 获取事件循环   至尊循环

tasks = [  # 创建task列表   批量爬虫
    loop.create_task(async_craw(url)) for url in Thread_example.spider.urls]

import time

start_time = time.time()
loop.run_until_complete(asyncio.wait(tasks))  # 执行爬虫事件列表，等到完成
end_time = time.time()
print("use time seconds:", end_time - start_time)
